package com.halden.mycache.core;

import com.halden.mycache.support.EvictStrategy.EvictStrategy;
import com.halden.mycache.support.aop.CacheInterceptor;
import com.halden.mycache.support.saveStrategy.AOFSaveStrategy.IAOFSaveStrategy;
import com.halden.mycache.support.saveStrategy.RDBSaveStrategy.IRDBSaveStrategy;
import com.halden.mycache.core.Impl.CacheValue;
import com.halden.mycache.support.listener.CacheRemoveContext;
import com.halden.mycache.support.listener.ICacheRemoveListener;

import java.util.Map;
import java.util.Set;

/**
 * 缓存核心实现接口
 * @param <K>
 * @param <V>
 * @since 0.0.1
 */
public interface IMyCache<K,V> extends ICacheExpire<K,V>{

    /**
     * 得到缓存大小
     * @return
     * @since 0.0.1
     */
    int getSize();

    /**
     * 得到缓存的已使用大小
     * @return
     * @since 0.0.1
     */
    int getLength();

    /**
     * 设置缓存已使用的长度
     * @param length
     */
    void setLength(int length);

    /**
     * 设置缓存大小
     * @param size
     */
    void setSize(int size);

    /**
     * 判断缓存是否为空
     * @return
     * @since 0.0.1
     */
    boolean isEmpty();

    /**
     * 判断是否存在某个Key
     * @param key
     * @return
     * @since 0.0.1
     */
    @CacheInterceptor(aof = false)
    boolean containsKey(K key);

    /**
     * 直接获取元素，不进行任何处理
     * @param key
     * @return
     * @since 0.0.1
     */
    @CacheInterceptor(aof = false)
    CacheValue<V> simpleGet(K key);

    /**
     * 通过key获取value对象
     * @param key
     * @return
     * @since 0.0.1
     */
    @CacheInterceptor(aof = false)
    V get(K key);

    /**
     * 添加新元素
     * @param key
     * @param value
     * @return
     * @since 0.0.1
     */
    @CacheInterceptor
    CacheValue<V> put(K key, V value);

    /**
     * 删除一个key,并传入监听器，用户不应该调用该方法
     * @param key
     * @return
     * @since 0.0.4
     */
    @CacheInterceptor
    V remove(K key, CacheRemoveContext<K,V> context);

    /**
     * 删除一个key,用户应该调用此方法进行删除
     * @param key
     * @return
     * @since 0.0.1
     */
    @CacheInterceptor
    V remove(K key);

    /**
     * 清空内存
     * @since 0.0.1
     */
    @CacheInterceptor
    void clear();

    /**
     * 得到所有key集合
     * @return
     * @since 0.0.1
     */
    Set<K> keySet();

    /**
     * 设置持久化策略
     * @param saveStrategy
     * @param fileName
     * @since 0.0.3
     */
    void setSaveStrategy(IRDBSaveStrategy<K,V> saveStrategy, String fileName);

    /**
     * 关闭缓存
     * @since 0.0.3
     */
    void close();

    /**
     * 返回entrySet的方法
     * @return
     * @since 0.0.3
     */
    Set<Map.Entry<K,CacheValue<V>>> entrySet();

    /**
     * 设置核心map的方法
     * @since 0.0.3
     */
    Map<K,CacheValue<V>> map();

    /**
     * 设置核心map
     * @param map
     * @since 0.0.4
     */
    void setMap(Map<K,CacheValue<V>> map);

    /**
     * 设置淘汰策略
     * @param evictStrategy
     * @since 0.0.4
     */
    void setEvictStrategy(EvictStrategy evictStrategy);

    /**
     * 设置删除监听器
     * @param cacheRemoveListener
     * @since 0.0.4
     */
    void setCacheRemoveListener(ICacheRemoveListener<K,V> cacheRemoveListener);

    /**
     * 读取rdb持久化文件
     * @param fileName
     * @since 0.0.3
     */
    @CacheInterceptor
    void readRdbFile(String fileName);

    /**
     * 读取aof持久化文件,需要指定全路径。使用反射实现，不建议使用
     * @param fileName
     */
    void readAofFile(String fileName);

    /**
     * 设置aof持久化策略
     * @param aofSaveStrategy
     * @since 0.0.5
     */
    void setAofSaveStrategy(IAOFSaveStrategy aofSaveStrategy);
}
